JPA
View Object
因为前端要的字段可能跟数据库里的不同,或者要其他的数据,都在一个接口处返回,或者嵌套对象返回。
解决方法是使用一大片 getter setter for 语句来处理,代码极其不好看。于是花半天时间查阅 jpa 文档,发现可以用到 VO 来解决这些问题。
这里直接就贴上代码看一下就ok了。
1 2 3 4 5 6 7 8 9 10 11
| public interface CompreGradeItem { Integer getCompreRank(); @Value("#{target.student.major}") String getMajor(); @Value("#{@compreGradeBean.getAddGroup(target)}") List<Object> getAddGroup(); }
|
1 2 3 4 5 6 7 8 9 10 11 12
| @Component public class CompreGradeBean { private final CompreAddGradeRepository compreAddGradeRepository; private final AwardBean awardBean; @Autowired public CompreGradeBean(CompreAddGradeRepository compreAddGradeRepository, AwardBean awardBean) { this.compreAddGradeRepository = compreAddGradeRepository; this.awardBean = awardBean; } public List<Object> getAddGroup(CompreGradeEntity compreGradeEntity) { }
|
1 2 3
| public interface CompreGradeRepository extends JpaRepository<CompreGradeEntity, String> { Page<CompreGradeItem> findAllByStudentMajorLikeAndStudentStuClassLikeAndYearTerm(String major,String stuClass,String yearTerm,Pageable pageable); }
|
更新:
用这种方法,由于 jpa 无法预知程序员想要留下的字段,所以直接全部字段都查询出来,数据量少应该无所谓,但是最好还是写 nativeQuery 这样数据库压力会小点,但是返回的是 List<Object[]>
映射字段名就麻烦了。用 setter ?不存在的。尽量避免写出无意义,而且容易出错的代码
下面说一下我正在使用的方法:
配合 java 8 的特性 stream 实现字段映射:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| class ClassForm { private String A; private String B; private String C; public static ClassForm map(Object[] i){ ClassForm tmp = new ClassForm(); tmp.setA(i[0]); tmp.setB(i[1]); return tmp; } public ClassForm setC(String c){ this.C = c; return this; } }
|
1 2 3 4
| List<Object[]> x = repository.findAllByXXX(xxx); List<ClassForm> r = x.stream().map(s->ClassForm.map(s).setC(myBean.getC(s[2]))).Collect(Collector.toList());
|